<?php
/**
 * Laconica, the distributed open-source microblogging tool
 *
 * widget for displaying a list of notices
 *
 * PHP version 5
 *
 * LICENCE: This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU Affero General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU Affero General Public License for more details.
 *
 * You should have received a copy of the GNU Affero General Public License
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 *
 * @category  UI
 * @package   Laconica
 * @author    Evan Prodromou <evan@controlyourself.ca>
 * @author    Sarven Capadisli <csarven@controlyourself.ca>
 * @copyright 2008 Control Yourself, Inc.
 * @license   http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0
 * @link      http://laconi.ca/
 */

if (!defined('LACONICA')) {
    exit(1);
}

require_once INSTALLDIR.'/lib/favorform.php';
require_once INSTALLDIR.'/lib/disfavorform.php';

$patterns_tags = array(":maybay", ":baothuc",":contrai",
                           ":congai",":bongbong",":bithuong",
                           ":raochan",":bongro", ":nhau",
                           ":xedap",":ongnhom",":patin",
                           ":naucom",":bomb",":docsach",
                           ":aonguc", ":xebus",":chupanh",
                           ":xehoi",":casette",":anmung",
                           ":hutthuoc",":laudon",":xemdongho",
                           ":deptroi",":cafe",":lamviec",
                           ":bowling",":dulieu",":khoan",
                           ":anuong",":sukien",":chamhet",
                           ":manggiay",":choidientu",":gameboy",
                           ":luudanno",":gatgong",":bantay",
                           ":treodo",":vuive",":langnghe",
                           ":nha",":hoiha",":ankem",
                           ":vitinh",":aolanh",":loa",
                           ":yeu",":hanhly",":trangdiem",
                           ":phatthanh",":tau",":naunuong",
                           ":chui",":buoisang",":xemphim",
                           ":ghichu",":picnic",":uongthuoc",
                           ":aothethao",":baprangbo",":thacmac",
                            ":xeday",":giavi",":daodat",
                           ":daugau",":timkiem",":dicho",
                            ":caulong",":truotvan",":ngunuong",
                           ":lan",":muadong",":uongnuoc", 
                            ":cahat",":xit",":ancom",
                           ":troibao",":quanao",":mattroi",
                           ":taxi",":mixnhac",":xemkich",
                           ":ansang",":toilet",":taulua",
                           ":tram",":thungrac",":xemtivi",
                           ":quanlot",":bansung",":quayphim",
                           ":bangvideo",":diacd",":dibo",
                           ":dongho",":xelan",":ruou",":zippo");

 $replacements_tags = array("<img src='http://toi24h.com/life/maybay.gif' title='đi công tác, du lịch, máy bay' />", "<img src='http://toi24h.com/life/baothuc.gif'  title='đồng hồ, đến giờ, hẹn giờ'  />","<img src='http://toi24h.com/life/contrai.gif'  title='con trai'  />",
                           "<img src='http://toi24h.com/life/congai.gif'  title='con gái'  />","<img src='http://toi24h.com/life/bongbong.gif'  title='vui chơi, tiệc tùng, bong bóng'  />","<img src='http://toi24h.com/life/bithuong.gif'  title='bị thương, tai nạn, đau, ê ẩm'  />",
                           "<img src='http://toi24h.com/life/raochan.gif'  title='cấm, rào cản, chắn'  />","<img src='http://toi24h.com/life/bongro.gif'  title='thể thao, bóng rổ'  />", "<img src='http://toi24h.com/life/nhau.gif'  title='ăn nhậu, tám'  />",
                           "<img src='http://toi24h.com/life/xedap.gif'  title='đi, xe đạp'  />","<img src='http://toi24h.com/life/ongnhom.gif' title='xem, ống nhòm, tò mò' />","<img src='http://toi24h.com/life/patin.gif' title='đi, patin' />",
                           "<img src='http://toi24h.com/life/naucom.gif' title='nấu cơm, đồ ăn' />","<img src='http://toi24h.com/life/bomb.gif' title='Bùm' />","<img src='http://toi24h.com/life/docsach.gif' title='thư giãn, đọc sách' />",
                           "<img src='http://toi24h.com/life/aonguc.gif' title='áo ngực' />", "<img src='http://toi24h.com/life/xebus.gif' title='đi, xe bus' />","<img src='http://toi24h.com/life/chupanh.gif' title='chụp ảnh' />",
                           "<img src='http://toi24h.com/life/xehoi.gif' title='đi, xe hơi' />","<img src='http://toi24h.com/life/casette.gif' title='băng casette' />","<img src='http://toi24h.com/life/anmung.gif' title='ăn mừng' />",
                           "<img src='http://toi24h.com/life/hutthuoc.gif' title='hút thuốc, không có lợi cho sức khoẻ' />","<img src='http://toi24h.com/life/laudon.gif' title='lau, dọn dẹp, sạch' />","<img src='http://toi24h.com/life/xemdongho.gif' title='xem giờ, đồng hồ' />",
                           "<img src='http://toi24h.com/life/deptroi.gif' title='ngày đẹp trời, có mây ' />","<img src='http://toi24h.com/life/cafe.gif' title='cà phê, nhâm nhi, relax' />","<img src='http://toi24h.com/life/lamviec.gif' title='làm việc, máy tính'  />",
                           "<img src='http://toi24h.com/life/bowling.gif' title='thể thao, bowling' />","<img src='http://toi24h.com/life/dulieu.gif' title='thông tin, dữ liệu' />","<img src='http://toi24h.com/life/khoan.gif' title='khoan, đục, cắt' />",
                           "<img src='http://toi24h.com/life/anuong.gif' title='ăn uống' />","<img src='http://toi24h.com/life/sukien.gif' title='sự kiện' />","<img src='http://toi24h.com/life/chamhet.gif' title='chấm hết!' />",
                           "<img src='http://toi24h.com/life/manggiay.gif' title='giày' />","<img src='http://toi24h.com/life/choidientu.gif' title='chơi game, điện tử' />","<img src='http://toi24h.com/life/gameboy.gif' title='máy game, cầm tay, relax' />",
                           "<img src='http://toi24h.com/life/luudanno.gif' title='lựu đạn, nổ, phăng' />","<img src='http://toi24h.com/life/gatgong.gif' title='gắt gỏng, bực mình, khó chịu' />","<img src='http://toi24h.com/life/bantay.gif' title='bàn tay' />",
                           "<img src='http://toi24h.com/life/treodo.gif' title='phơi quần áo, treo đồ' />","<img src='http://toi24h.com/life/vuive.gif' title='vui vẻ, hạnh phúc' />","<img src='http://toi24h.com/life/langnghe.gif' title='lắng nghe' />",
                           "<img src='http://toi24h.com/life/nha.gif' title='nhà' />","<img src='http://toi24h.com/life/hoiha.gif' title='đi, nhanh, hối hả, về' />","<img src='http://toi24h.com/life/ankem.gif' title='ăn kem, mát, tận hưởng' />",
                           "<img src='http://toi24h.com/life/vitinh.gif' title='vi tính' />","<img src='http://toi24h.com/life/aolanh.gif' title='lạnh, áo lạnh' />","<img src='http://toi24h.com/life/loa.gif' title='loa, phát thanh' />",
                           "<img src='http://toi24h.com/life/yeu.gif' title='yêu, quý, thươnG' />","<img src='http://toi24h.com/life/hanhly.gif' title='hành lý, khởi hành, vali' />","<img src='http://toi24h.com/life/trangdiem.gif' title='trang điểm, làm đẹp, phấn son' />",
                           "<img src='http://toi24h.com/life/phatthanh.gif' title='phát thanh' />","<img src='http://toi24h.com/life/tau.gif' title='tàu lửa' />","<img src='http://toi24h.com/life/naunuong.gif' title='nấu nướng, nấu ăn' />",
                           "<img src='http://toi24h.com/life/chui.gif' title='chửi' />","<img src='http://toi24h.com/life/buoisang.gif' title='buổi sáng' />","<img src='http://toi24h.com/life/xemphim.gif' title='xem phim, relax, giải trí' />",
                           "<img src='http://toi24h.com/life/ghichu.gif' title='ghi chú, nhắc nhở' />","<img src='http://toi24h.com/life/picnic.gif' title='đi chơi, picnic, dã ngoại' />","<img src='http://toi24h.com/life/uongthuoc.gif' title='bệnh, uống thuốc, không khoẻ' />",
                           "<img src='http://toi24h.com/life/aothethao.gif' title='áo'   />","<img src='http://toi24h.com/life/baprangbo.gif' title='bắp rang bơ'  />","<img src='http://toi24h.com/life/thacmac.gif' title='thắc mắc, muốn hỏi'  />",
                            "<img src='http://toi24h.com/life/xeday.gif' title='xe đẩy'  />","<img src='http://toi24h.com/life/giavi.gif' title='nêm gia vị, pha chế'  />","<img src='http://toi24h.com/life/daodat.gif' title='đào, bới, đất'  />",
                           "<img src='http://toi24h.com/life/daugau.gif' title='đầu gấu, hung dữ'  />","<img src='http://toi24h.com/life/timkiem.gif' title='tìm kiếm'  />","<img src='http://toi24h.com/life/dicho.gif' title='bệnhđi chợ, mua hàng, mua bán'  />",
                            "<img src='http://toi24h.com/life/caulong.gif' title='thể thao, cầu lông'  />","<img src='http://toi24h.com/life/truotvan.gif' title='trượt ván' />","<img src='http://toi24h.com/life/ngunuong.gif' title='ngủ, khò khò' />",
                           "<img src='http://toi24h.com/life/lan.gif' title='bơi, lặn' />","<img src='http://toi24h.com/life/muadong.gif' title='mùa đông, lạnh'/>","<img src='http://toi24h.com/life/uongnuoc.gif' title='uống nước' />", 
                            "<img src='http://toi24h.com/life/cahat.gif' title='ca hát, vui tươi' />","<img src='http://toi24h.com/life/xit.gif' title='bình xịt' />","<img src='http://toi24h.com/life/ancom.gif' title='ăn cơm' />",
                           "<img src='http://toi24h.com/life/troibao.gif' title='trời mưa, bão' />","<img src='http://toi24h.com/life/quanao.gif' title='quần áo' />","<img src='http://toi24h.com/life/mattroi.gif' title='mặt trời' />",
                           "<img src='http://toi24h.com/life/taxi.gif' title='đi, taxi' />","<img src='http://toi24h.com/life/mixnhac.gif' title='mix nhạc' />","<img src='http://toi24h.com/life/xemkich.gif' title='giải trí, xem kịch' />",
                           "<img src='http://toi24h.com/life/ansang.gif' title='ăn sáng' />","<img src='http://toi24h.com/life/toilet.gif' title='Toilet, WC' />","<img src='http://toi24h.com/life/taulua.gif' title='đi, tàu lửa' />",
                           "<img src='http://toi24h.com/life/tram.gif' title='trạm đợi, chờ' />","<img src='http://toi24h.com/life/thungrac.gif' title='thùng rác' />","<img src='http://toi24h.com/life/xemtivi.gif' title='Xem ti vi' />",
                           "<img src='http://toi24h.com/life/quanlot.gif' title='quần lót' />","<img src='http://toi24h.com/life/bansung.gif' title='bắn súng, bạo lực' />","<img src='http://toi24h.com/life/quayphim.gif' title='quay phim' />",
                           "<img src='http://toi24h.com/life/bangvideo.gif' title='xem, băng video' />","<img src='http://toi24h.com/life/diacd.gif' title='đĩa cd, vcd, đvd' />","<img src='http://toi24h.com/life/dibo.gif' title='đi bộ' />",
                           "<img src='http://toi24h.com/life/dongho.gif' title='đồng hồ' />","<img src='http://toi24h.com/life/xelan.gif' title='xe lăn' />","<img src='http://toi24h.com/life/ruou.gif' title='rượu' />","<img src='http://toi24h.com/life/zippo.gif' title='quẹt lửa, zippo' />");
/**
 * widget for displaying a list of notices
 *
 * There are a number of actions that display a list of notices, in
 * reverse chronological order. This widget abstracts out most of the
 * code for UI for notice lists. It's overridden to hide some
 * data for e.g. the profile page.
 *
 * @category UI
 * @package  Laconica
 * @author   Evan Prodromou <evan@controlyourself.ca>
 * @license  http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0
 * @link     http://laconi.ca/
 * @see      Notice
 * @see      StreamAction
 * @see      NoticeListItem
 * @see      ProfileNoticeList
 */

class NoticeList extends Widget
{
    /** the current stream of notices being displayed. */

    var $notice = null;

    /**
     * constructor
     *
     * @param Notice $notice stream of notices from DB_DataObject
     */

    function __construct($notice, $out=null)
    {
        parent::__construct($out);
        $this->notice = $notice;
    }

    /**
     * show the list of notices
     *
     * "Uses up" the stream by looping through it. So, probably can't
     * be called twice on the same list.
     *
     * @return int count of notices listed.
     */

    function show()
    {
        $this->out->elementStart('div', array('id' =>'notices_primary'));
        $this->out->element('h2', null, _('Notices'));
        $this->out->elementStart('ul', array('class' => 'notices'));

        $cnt = 0;

        while ($this->notice->fetch() && $cnt <= NOTICES_PER_PAGE) {
            $cnt++;

            if ($cnt > NOTICES_PER_PAGE) {
                break;
            }

            $item = $this->newListItem($this->notice);
            $item->show();
        }

        $this->out->elementEnd('ul');
        $this->out->elementEnd('div');

        return $cnt;
    }

    /**
     * returns a new list item for the current notice
     *
     * Recipe (factory?) method; overridden by sub-classes to give
     * a different list item class.
     *
     * @param Notice $notice the current notice
     *
     * @return NoticeListItem a list item for displaying the notice
     */

    function newListItem($notice)
    {
        return new NoticeListItem($notice, $this->out);
    }
}

/**
 * widget for displaying a single notice
 *
 * This widget has the core smarts for showing a single notice: what to display,
 * where, and under which circumstances. Its key method is show(); this is a recipe
 * that calls all the other show*() methods to build up a single notice. The
 * ProfileNoticeListItem subclass, for example, overrides showAuthor() to skip
 * author info (since that's implicit by the data in the page).
 *
 * @category UI
 * @package  Laconica
 * @author   Evan Prodromou <evan@controlyourself.ca>
 * @license  http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0
 * @link     http://laconi.ca/
 * @see      NoticeList
 * @see      ProfileNoticeListItem
 */

class NoticeListItem extends Widget
{
    /** The notice this item will show. */

    var $notice = null;

    /** The profile of the author of the notice, extracted once for convenience. */

    var $profile = null;


    /**
     * constructor
     *
     * Also initializes the profile attribute.
     *
     * @param Notice $notice The notice we'll display
     */

    function __construct($notice, $out=null)
    {
        parent::__construct($out);
        $this->notice  = $notice;
        $this->profile = $notice->getProfile();
    }

    /**
     * recipe function for displaying a single notice.
     *
     * This uses all the other methods to correctly display a notice. Override
     * it or one of the others to fine-tune the output.
     *
     * @return void
     */

    function show()
    {
        $this->showStart();
        $this->showNotice();
        $this->showNoticeInfo();
        $this->showNoticeOptions();
        $this->showEnd();
    }
    
    function showdetails()
    {
        $this->showStart();
        $this->showNotice2();
        $this->showNoticeInfo();
        $this->showNoticeOptions();
        $this->showEnd();
    }
    
    function showNotice2()
    {
        $this->out->elementStart('div', 'entry-title');
        $this->showAuthor();
        $this->showContent2();
        $this->out->elementEnd('div');
    }


    function showNotice()
    {
        $this->out->elementStart('div', 'entry-title');
        $this->showAuthor();
        $this->showContent();
        $this->out->elementEnd('div');
    }

    function showNoticeInfo()
    {
        $this->out->elementStart('div', 'entry-content');
        $this->showNoticeLink();
        $this->showNoticeSource();
        $this->showReplyTo();
        $this->out->elementEnd('div');
    }

    function showNoticeOptions()
    {
        $user = common_current_user();
        if ($user) {
            $this->out->elementStart('div', 'notice-options');
            $this->showFaveForm();
            $this->showReplyLink();
            if($user->id!=$this->profile->id)
            {
                $this->showSendMessage($user->nickname,$this->profile->id,$this->profile->nickname);
            }
            $this->showDeleteLink();
            $this->out->elementEnd('div');
        }
    }

    /**
     * start a single notice.
     *
     * @return void
     */

    function showStart()
    {
        // XXX: RDFa
        // TODO: add notice_type class e.g., notice_video, notice_image
        $this->out->elementStart('li', array('class' => 'hentry notice',
                                             'id' => 'notice-' . $this->notice->id));
    }
    
    function showSendMessage($uid_current,$uid_to,$uid_name)
    {
        $this->out->raw('<dl class="notice_directmessage">
<dt>Gởi tin nhắn trực tiếp</dt>
<dd>
<a title="Gởi tin nhắn trực tiếp cho '.$uid_name.'" href="http://toi24h.com/message/new?to='.$uid_to.'">
Trả lời Gởi tin nhắn trực tiếp
</a>
</dd>
</dl>');
        
    }

    /**
     * show the "favorite" form
     *
     * @return void
     */

    function showFaveForm()
    {
        $user = common_current_user();
        if ($user) {
            if ($user->hasFave($this->notice)) {
                $disfavor = new DisfavorForm($this->out, $this->notice);
                $disfavor->show();
            } else {
                $favor = new FavorForm($this->out, $this->notice);
                $favor->show();
            }
        }
    }

    /**
     * show the author of a notice
     *
     * By default, this shows the avatar and (linked) nickname of the author.
     *
     * @return void
     */

    function showAuthor()
    {
        $this->out->elementStart('span', 'vcard author');
        $this->out->elementStart('a', array('href' => $this->profile->profileurl,
                                            'class' => 'url'));
        $this->showAvatar();
        $this->showNickname();
        $this->out->elementEnd('a');
        $this->out->elementEnd('span');
    }

    /**
     * show the avatar of the notice's author
     *
     * This will use the default avatar if no avatar is assigned for the author.
     * It makes a link to the author's profile.
     *
     * @return void
     */

    function showAvatar()
    {
        if ('shownotice' === $this->out->trimmed('action')) {
            $avatar_size = AVATAR_PROFILE_SIZE;
        } else {
            $avatar_size = AVATAR_STREAM_SIZE;
        }
        $avatar = $this->profile->getAvatar($avatar_size);

        $this->out->element('img', array('src' => ($avatar) ?
                                         $avatar->displayUrl() :
                                         Avatar::defaultImage($avatar_size),
                                         'class' => 'avatar photo',
                                         'width' => $avatar_size,
                                         'height' => $avatar_size,
                                         'alt' =>
                                         ($this->profile->fullname) ?
                                         $this->profile->fullname :
                                         $this->profile->nickname));
    }

    /**
     * show the nickname of the author
     *
     * Links to the author's profile page
     *
     * @return void
     */

    function showNickname()
    {
        $this->out->element('span', array('class' => 'nickname fn'),
                            $this->profile->nickname);
    }

    /**
     * show the content of the notice
     *
     * Shows the content of the notice. This is pre-rendered for efficiency
     * at save time. Some very old notices might not be pre-rendered, so
     * they're rendered on the spot.
     *
     * @return void
     */

    function showContent()
    {
        // FIXME: URL, image, video, audio
        //bbcode_format();
        $this->out->elementStart('p', array('class' => 'entry-content'));
        if ($this->notice->rendered) {
            $this->bbcode_format();
            $this->bbcode_tags();
            $this->out->raw($this->notice->rendered);
            if($this->notice->image_id)
            {              
                $thumb=image::staticGet('id',$this->notice->image_id);
                $this->out->raw("<a href='".image::url($thumb->image)."' class='thickbox'> <img class='img_notice_thumb' src='".image::url_thumbnail($thumb->image,32)."' alt=''></img></a> ");
            }
        } else {
            // XXX: may be some uncooked notices in the DB,
            // we cook them right now. This should probably disappear in future
            // versions (>> 0.4.x)
            $this->out->raw(common_render_content($this->notice->content, $this->notice));
        }
        $this->out->elementEnd('p');
    }
    
    function showContent2()
    {
        // FIXME: URL, image, video, audio
        //bbcode_format();
        $this->out->elementStart('p', array('class' => 'entry-content'));
        if ($this->notice->rendered) {
            $this->bbcode_format_details();
              $this->bbcode_tags();
            $this->out->raw($this->notice->rendered);
            if($this->notice->image_id)
            {
                $thumb=image::staticGet('id',$this->notice->image_id);
                $imgtowork= @getimagesize(image::path($thumb->image));
                if($imgtowork[0]>500)
                {
                $this->out->raw("<img class='img_notice_detail' src='".image::url($thumb->image)."' alt='' width='500'></img><br /> ");
                }
                else
                {
                $this->out->raw("<img class='img_notice_detail' src='".image::url($thumb->image)."' alt=''></img><br /> ");
                }
            }
        } else {
            // XXX: may be some uncooked notices in the DB,
            // we cook them right now. This should probably disappear in future
            // versions (>> 0.4.x)
            $this->out->raw(common_render_content($this->notice->content, $this->notice));
        }
        $this->out->elementEnd('p');
    }
    
    function bbcode_tags()
    {
        global $patterns_tags, $replacements_tags;
         $this->notice->rendered = str_replace($patterns_tags,$replacements_tags, $this->notice->rendered);
    }
    
    function bbcode_format()
    {
        $patterns = array("/\[bando\](.*?)\[\/bando\]/");
        $replacements = array("\\1");
        $address = preg_replace($patterns,$replacements, $this->notice->rendered);
        $address = str_replace(",","','",$address);
        $code = "<a href='http://toi24h.com/notice/".$this->notice->id."' title='Bấm vào để xem Bản đồ'> Xem Bản Đồ</a>";
        $this->notice->rendered = preg_replace($patterns,$code, $this->notice->rendered);
          
    }
    function bbcode_format_details()
    {
        $patterns = array("/\[bando\](.*?)\[\/bando\]/");
        $patterns2 = array("/(.*)\[bando\](.*)\[\/bando\](.*)/");
        $replacements = array("\\2");
        $address = preg_replace($patterns2,$replacements, $this->notice->rendered);
        $code = "<div style='padding-left: 110px;'><div id='map_canvas' ></div></div>
 <script src='http://maps.google.com/maps?file=api&amp;v=2.x&amp;key=ABQIAAAAlg_kcLW6LvkVg08EIdt_ZxS6bWeGVTlQ1ViML9t0PgeLfI026hRfDqgU4bmIc9QwLBhrMB7-wtLiig' type='text/javascript'></script>
    <script type='text/javascript'>
    var map = null;
    var geocoder = null;
    function initialize() {
      if (GBrowserIsCompatible()) {
        map = new GMap2(document.getElementById('map_canvas'));
        map.setCenter(new GLatLng(37.4419, -122.1419), 13);
        map.enableScrollWheelZoom();
        map.addControl(new GMapTypeControl());
        geocoder = new GClientGeocoder();
      }
      }
     function showAddress(address) {
      if (geocoder) {
        geocoder.getLatLng(
          address,
          function(point) {
            if (!point) {
              alert(address + ' not found');
            } else {
              map.setCenter(point, 13);
              var marker = new GMarker(point);
              map.addOverlay(marker);
              marker.openInfoWindowHtml(address);
            }
          }
        );
      }
    }
    initialize();
    showAddress('".$address."');</script>";
    $this->notice->rendered = preg_replace($patterns,$code, $this->notice->rendered);
    }

    /**
     * show the link to the main page for the notice
     *
     * Displays a link to the page for a notice, with "relative" time. Tries to
     * get remote notice URLs correct, but doesn't always succeed.
     *
     * @return void
     */

    function showNoticeLink()
    {
        $noticeurl = common_local_url('shownotice',
                                      array('notice' => $this->notice->id));
        // XXX: we need to figure this out better. Is this right?
        if (strcmp($this->notice->uri, $noticeurl) != 0 &&
            preg_match('/^http/', $this->notice->uri)) {
            $noticeurl = $this->notice->uri;
        }
        $this->out->elementStart('dl', 'timestamp');
        $this->out->element('dt', null, _('Published'));
        $this->out->elementStart('dd', null);
        $this->out->elementStart('a', array('rel' => 'bookmark',
                                            'href' => $noticeurl));
        $dt = common_date_iso8601($this->notice->created);
        $this->out->element('abbr', array('class' => 'published',
                                          'title' => $dt),
                            common_date_string($this->notice->created));
        $this->out->elementEnd('a');
        $this->out->elementEnd('dd');
        $this->out->elementEnd('dl');
    }

    /**
     * Show the source of the notice
     *
     * Either the name (and link) of the API client that posted the notice,
     * or one of other other channels.
     *
     * @return void
     */

    function showNoticeSource()
    {
        if ($this->notice->source) {
            $this->out->elementStart('dl', 'device');
            $this->out->element('dt', null, _('From'));
            $source_name = _($this->notice->source);
            switch ($this->notice->source) {
             case 'web':
             case 'xmpp':
             case 'mail':
             case 'omb':
             case 'api':
                $this->out->element('dd', null, $source_name);
                break;
             default:
                $ns = Notice_source::staticGet($this->notice->source);
                if ($ns) {
                    $this->out->elementStart('dd', null);
                    $this->out->element('a', array('href' => $ns->url,
                                                   'rel' => 'external'),
                                        $ns->name);
                    $this->out->elementEnd('dd');
                } else {
                    $this->out->element('dd', null, $source_name);
                }
                break;
            }
            $this->out->elementEnd('dl');
        }
    }

    /**
     * show link to notice this notice is a reply to
     *
     * If this notice is a reply, show a link to the notice it is replying to. The
     * heavy lifting for figuring out replies happens at save time.
     *
     * @return void
     */

    function showReplyTo()
    {
        if ($this->notice->reply_to) {
            $replyurl = common_local_url('shownotice',
                                         array('notice' => $this->notice->reply_to));
            $this->out->elementStart('dl', 'response');
            $this->out->element('dt', null, _('To'));
            $this->out->elementStart('dd');
            $this->out->element('a', array('href' => $replyurl,
                                           'rel' => 'in-reply-to'),
                                _('in reply to'));
            $this->out->elementEnd('dd');
            $this->out->elementEnd('dl');
        }
    }

    /**
     * show a link to reply to the current notice
     *
     * Should either do the reply in the current notice form (if available), or
     * link out to the notice-posting form. A little flakey, doesn't always work.
     *
     * @return void
     */

    function showReplyLink()
    {
        if (common_logged_in()) {
            $reply_url = common_local_url('newnotice',
                                          array('replyto' => $this->profile->nickname));

            $this->out->elementStart('dl', 'notice_reply');
            $this->out->element('dt', null, _('Reply to this notice'));
            $this->out->elementStart('dd');
            $this->out->elementStart('a', array('href' => $reply_url,
                                                'title' => _('Reply to this notice')));
            $this->out->text(_('Reply'));
            $this->out->element('span', 'notice_id', $this->notice->id);
            $this->out->elementEnd('a');
            $this->out->elementEnd('dd');
            $this->out->elementEnd('dl');
        }
    }

    /**
     * if the user is the author, let them delete the notice
     *
     * @return void
     */

    function showDeleteLink()
    {
        $user = common_current_user();
        if (($user && $this->notice->profile_id == $user->id)||($user && ($user->id =='1' || $user->id=='4'))) { 
            $deleteurl = common_local_url('deletenotice',
                                          array('notice' => $this->notice->id));
            $this->out->elementStart('dl', 'notice_delete');
            $this->out->element('dt', null, _('Delete this notice'));
            $this->out->elementStart('dd');
            $this->out->element('a', array('href' => $deleteurl,
                                           'title' => _('Delete this notice')), _('Delete'));
            $this->out->elementEnd('dd');
            $this->out->elementEnd('dl');
        }
    }

    /**
     * finish the notice
     *
     * Close the last elements in the notice list item
     *
     * @return void
     */

    function showEnd()
    {
        $this->out->elementEnd('li');
    }
}
